package vip.xiaonuo.common.util;

import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * @author xbl
 */
@Slf4j
public class CommonSFtpUtil {

    /**
     * 上传文件到SFTP服务器（自动创建目录）
     *
     * @param host          服务器地址
     * @param port          端口号
     * @param username      用户名
     * @param password      密码
     * @param localFilePath 本地文件路径
     * @param remoteDir     远程目录路径
     * @param fileName      上传后的文件名
     */
    public static void uploadFile(String host, int port, String username, String password,
                                  String localFilePath, String remoteDir, String fileName)
            throws Exception {

        JSch jsch = new JSch();
        Session session = null;
        ChannelSftp sftpChannel = null;

        try {
            // 1. 创建SFTP连接
            session = jsch.getSession(username, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            // 2. 打开SFTP通道
            Channel channel = session.openChannel("sftp");
            channel.connect();
            sftpChannel = (ChannelSftp) channel;

            // 3. 创建远程目录（如果不存在）
            createRemoteDir(sftpChannel, remoteDir);

            // 4. 上传文件
            try (InputStream inputStream = new FileInputStream(localFilePath)) {
                sftpChannel.cd(remoteDir);
                sftpChannel.put(inputStream, fileName);
                log.info("文件上传成功: {}/{}", remoteDir, fileName);
            }

        } finally {
            // 5. 关闭连接
            if (sftpChannel != null && sftpChannel.isConnected()) {
                sftpChannel.exit();
            }
            if (session != null && session.isConnected()) {
                session.disconnect();
            }
        }
    }

    /**
     * 递归创建远程目录
     */
    private static void createRemoteDir(ChannelSftp sftp, String remoteDir) throws SftpException {
        try {
            sftp.cd(remoteDir);
        } catch (SftpException e) {
            // 目录不存在，开始创建
            String[] folders = remoteDir.split("/");
            String path = "";
            for (String folder : folders) {
                if (folder.isEmpty()) continue;
                path += "/" + folder;
                try {
                    sftp.cd(path);
                } catch (SftpException ex) {
                    sftp.mkdir(path);
                    sftp.cd(path);
                }
            }
        }
    }

    // 测试示例
    public static void main(String[] args) {
        try {
            uploadFile(
                    "101.226.247.209",   // SFTP服务器地址
                    60022,                  // 端口
                    "vcredit_test_guozhengxin",          // 用户名
                    "Vcredit-guozhengxin#20250624",          // 密码
                    "D:/asr/download/data-250618142215868.xlsx",  // 本地文件路径
                    "/upload/external/ZheJiangGuoZhengXin/coll_action/test",      // 远程目录（会自动创建）
//                    "/upload/external/ZheJiangGuoZhengXin/coll_action/" + CommonDateUtil.getYearMonthDateStr(),      // 远程目录（会自动创建）
                    "data-250618142215868.xlsx"       // 上传后的文件名
            );
        } catch (Exception e) {
            log.error("SFTP文件上传失败", e);
        }
    }
}